package cn.net.isir.service2;

import cn.net.isir.core.BasicService2;
import cn.net.isir.core.SetBasicDao;
import cn.net.isir.dao.CategoryDao;
import cn.net.isir.entity.Category;
import cn.net.isir.utils.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class CategoryService extends BasicService2<Category> {
    @SetBasicDao
    @Resource
    private CategoryDao categoryDao;

    /**
     * 重新将品类进行排序(新增，修改的时候适用)
     *
     * @param category 修改的品类
     */
    public void reSort(Category category) {

        Category cQuery = new Category();
        cQuery.setShopId(category.getShopId());
        List<Category> categoryList = categoryDao.selectList(cQuery);//已经排序过的列表（排序号从小到大）
        int newIndex = category.getSort();

        // 如果没有已经存在的序号，则无需重新排序
        boolean isExist = false;
        for (Category c : categoryList) {
            if (c.getSort() == newIndex) {
                isExist = true;
                break;
            }
        }
        if (!isExist) {
            return;
        }

        // 新增的时候，找到要新增的位置，然后找出大于等于当前排序的，都+1
        if (StringUtils.isBlank(category.getId())) {
//        categoryList.sort((o1, o2) -> o1.getSort() < o2.getSort() ? -1 : Objects.equals(o1.getSort(), o2.getSort()) ? 0 : 1);
            // 找出大于等于当前index的，然后下移更新
            List<Category> needChanges = categoryList.stream().filter(c -> c.getSort() >= newIndex).collect(Collectors.toList());
            if (needChanges.size() > 0) {
                needChanges.forEach(c -> {
                    c.setSort(c.getSort() + 1);
                    categoryDao.update(c);
                });
            }
        }
        // 更新的时候
        if (StringUtils.isNotBlank(category.getId())) {
            //分为两种情况：上移和下移
            Category oldCategory = categoryDao.selectByPrimaryKey(category.getId());
            int oldIndex = oldCategory.getSort();
            // 新排序等于旧排序，则则不移动
            if (oldCategory.getSort().equals(category.getSort())) {
                return;
            }
            // 新排序小于旧排序，则表示上移
            if (category.getSort() < oldCategory.getSort()) {
                // 找出小于旧index并且大于等于新index的，全部下移，然后上部腾出空给新的index
                List<Category> needChanges = categoryList.stream()
                        .filter(c -> c.getSort() >= newIndex && c.getSort() < oldIndex)
                        .collect(Collectors.toList());
                // 下移，给新index腾出空
                needChanges.forEach(c -> {
                    c.setSort(c.getSort() + 1);
                    categoryDao.update(c);
                });
            }
            // 新排序大于旧排序，表示下移
            if (category.getSort() > oldCategory.getSort()) {
                // 找出大于旧index并且小于等于旧index的，全部上移，然后下部腾出空给新的index
                List<Category> needChanges = categoryList.stream()
                        .filter(c -> c.getSort() > oldIndex && c.getSort() <= newIndex)
                        .collect(Collectors.toList());
                // 下移，给新index腾出空
                needChanges.forEach(c -> {
                    c.setSort(c.getSort() - 1);
                    categoryDao.update(c);
                });
            }
            // 更新移动项排序
            Category c2 = new Category();
            c2.setId(category.getId());
            c2.setSort(category.getSort());
            categoryDao.update(c2);
        }
    }

    /**
     * 重新将品类进行排序(删除适用)
     *
     * @param id 删除的品类
     */
    public void reSort(String id) {
        Category category = categoryDao.selectByPrimaryKey(id);
        Category cQuery = new Category();
        cQuery.setShopId(category.getShopId());
        List<Category> categoryList = categoryDao.selectList(cQuery);//已经排序过的列表（排序号从小到大）
        int newIndex = category.getSort();
        // 找出大于等于当前index的，然后下移更新
        List<Category> needChanges = categoryList.stream().filter(c -> c.getSort() > newIndex).collect(Collectors.toList());
        if (needChanges.size() > 0) {
            needChanges.forEach(c -> {
                c.setSort(c.getSort() - 1);
                categoryDao.update(c);
            });
        }
    }

}
